package com.gz.spring.tx.service;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;

@Service
public class MultiplyService {

    @Resource
    private GoodsService goodsService;

    //一:Propagation.REQUIRED和Propagation.REQUIRES_NEW  底下是这个的案例
    //该方法有两次购买行为
    //1.propagation = Propagation.REQUIRED表示一个大事务内的小事务出现回滚(即出错),整个事务都回滚
    //propagation = Propagation.REQUIRED是默认值，不写就默认是这个
    //2.propagation = Propagation.REQUIRES_NEW 表示每个都是单独的事务，
    // 其中一个出错自行回滚，但不影响其他的事务，即只有出错的回滚，其他不回滚
    //3.Propagation.REQUIRED和Propagation.REQUIRES_NEW只出现一种，
    // 即要不全是Propagation.REQUIRES_NEW，要不全是Propagation.REQUIRED

    //二:隔离级别  (通用)
    // 默认情况下，声明式事务的隔离级别是REPEATABLE_READ(可重复读)，
    // 可重复读(默认，推荐):比如在先启动debug,在debug过程中mysql修改数据，这里读到的依然是未改变之前的数据
    //读已提交:在先启动debug,在debug过程中mysql修改数据，这里读到的依然是改变之后的的数据

    //三:超时回滚 (通用)
    //@Transactional(timeout = 2)
    //表示multiplyBuyGoodsByTx()执行时间超过2秒，自动回滚
    //可以用Thread.sleep()来测试
    //如果没有设置，默认是-1
    @Transactional //(isolation = Isolation.REPEATABLE_READ)
    public void multiplyBuyGoodsByTx() {
        goodsService.buyGoodsByTx(1,1,1);
        goodsService.buyGoodsByTx2(1,1,1);
    }
}
